#pragma once

#include <vector>
#include <functional>

namespace ZMH
{
    struct process
    {
        int _fd;    // 子进程的管道文件描述符
        pid_t _pid; // 进程标识符
    
        process(int fd, pid_t pid)
            : _fd(fd), _pid(pid) {};
    };
    
    class process_pool
    {
    public:
        process_pool(size_t cnt = 0,std::vector<std::function<void()>> tm = std::vector<std::function<void()>>()); // 进程、任务初始化
        ~process_pool(); // 进程、管道、任务等资源的回收
        // 拷贝构造 赋值 - 编译器自己生成的都可以
        // 移动构造需要自己实现 移动赋值也需要 --- 不管了
        // bool task_register(); // 单个任务的注册 暂且不管
        void close_all_pipeW(); // 进程通信(IPC)的安全性 - 保证所有管道文件一个进程写，另一个进程读
    
        size_t send(int code); // 父进程派发任务 - 返回待执行code任务的进程下标
        void execut(); // 子进程执行任务
    
        size_t process_size(); // 返回进程规模
        size_t task_size(); // 返回任务规模
    private:
        std::vector<process> _pm; // 进程管理
        std::vector<std::function<void()>> _tm; // 任务管理
        size_t _cnt; // 负责轮询的成员变量
    };
}

